package com.open.capacity.config;


import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.SerializerMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * 消息队列的配置类
 *
 * @author y022
 */
@Configuration
public class RabbitConfig {

    @Bean
    Queue deadQueue() {  //创建一个消息队列，指定名称，和相关属性
        return new Queue("Dead-Queue", true, false, false);
    }

//    @Bean
//    DirectExchange mailTopicExchange() {
//        return new DirectExchange("MESSAGE_EXCHANGE", true, false);
//    }
//
//    @Bean
//    Binding mailQueueTopic() {
//        return BindingBuilder.bind(mailQueue()).to(mailTopicExchange()).with("RoutingKey3");
//    }
//   @Value("$(spring.rabbitmq.username)")
//    private String username;
//   @Value("$(spring.rabbitmq.password)")
//    private String password;
//   @Value("$(spring.rabbitmq.host)")
//    private  String host;
//   @Value("$(spring.rabbitmq.port)")
//    private  String port;

    @Bean
    public ConnectionFactory connectFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setVirtualHost("/");
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setPublisherConfirms(true);//开启确认模式
        connectionFactory.setPublisherReturns(true);//确认回退模式

        return connectionFactory;
    }


    /**
     * 创建admin，为了能自定义队列或者交换机
     */
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }



    @Bean
    @Scope("prototype")
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMandatory(true);
        template.setMessageConverter(new SerializerMessageConverter());
        template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *消息投递可靠性的确认模式
             * @param correlationData 相关配置信息
             * @param ack 消息是否投递到了交换机
             * @param s 失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String s) {
                if (ack) {
                    System.out.println("消息到达rabbitmq服务器");
                } else {
                    System.out.println("消息可能未到达rabbitmq服务器");
                    System.out.println("失败的原因：" + s);
                    //发送失败之后，一般要做一些常见的消息处理工作，比如重新发送消息等
                }
            }
        });

        template.setMandatory(true);//开启消息回退，如果不写这行代码， 那么如果消息没有被发送，那么就会被丢弃,
        template.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             *消息投递可靠性的回退模式
             * @param message 消息对象
             * @param i 失败的错误码
             * @param s 错误信息
             * @param s1 交换机
             * @param s2 路由键
             */
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
                System.out.println("returnCallback执行了");
            }
        });
        return template;
    }

}